package br.com.petsis.funcionalidades.manterProduto;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Produto;

@Name("manterProdutoController")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('Administrador')}")
public class ManterProdutoController {
	
	private static final String QRY_PRODUTOS = "select p.id_produto,p.dsc_nome,p.dosagem,p.qtd_estoque,p.dsc_fabricante,p.vlr_produto,p.vlr_produto_custo,p.cod_barras from produto p where p.id_empresa = :idEmpresa and p.flg_ativo = 'T' order by p.dsc_nome";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Produto> listaProdutos;
	
	private Produto produtoEdicao;
	
	private boolean selecionadoTodos;
	
	@In(required=false)
	private Empresa empresaSessao;
	
	private String filtroNome;
	
	private String filtroFabricante;
	
	private Integer filtroQtdeEstoque;
	
	public String getFiltroNome() {
		return filtroNome;
	}

	public void setFiltroNome(String filtroNome) {
		this.filtroNome = filtroNome;
	}

	public String getFiltroFabricante() {
		return filtroFabricante;
	}

	public void setFiltroFabricante(String filtroFabricante) {
		this.filtroFabricante = filtroFabricante;
	}

	public Integer getFiltroQtdeEstoque() {
		return filtroQtdeEstoque;
	}

	public void setFiltroQtdeEstoque(Integer filtroQtdeEstoque) {
		this.filtroQtdeEstoque = filtroQtdeEstoque;
	}
	
	public boolean filtrarPorNome(Object current){
		Produto produto = (Produto)current;
		if(getFiltroNome() == null || getFiltroNome().isEmpty()){
			return true;
		}
		if(produto.getDscNome().toLowerCase().contains(getFiltroNome().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean filtrarPorFabricante(Object current){
		Produto produto = (Produto)current;
		if(getFiltroFabricante() == null || getFiltroFabricante().isEmpty()){
			return true;
		}
		if(produto.getDscFabricante().toLowerCase().contains(getFiltroFabricante().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean filtrarPorQtdeEstoque(Object current){
		Produto produto = (Produto)current;
		if(getFiltroQtdeEstoque() == null){
			return true;
		}
		if(produto.getQtdEstoque() == getFiltroQtdeEstoque().intValue()){
			return true;
		}else{
			return false;
		}
	}

	public void onLoad(){
		
	}
	
	public void onLoadList(){
		produtoEdicao = new Produto();
	}
	
	public String novoProduto(){
		return "novo";
	}

	public List<Produto> getListaProdutos() {
		
		if (listaProdutos == null) {
			listaProdutos = new ArrayList<Produto>();
			if(empresaSessao != null){
				List<Object[]> lista = entityManager.createNativeQuery(QRY_PRODUTOS)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
				Produto p;
				for(Object[] o : lista){
					p = new Produto();
					p.setIdProduto(Integer.parseInt(o[0].toString()));
					p.setDscNome(o[1] != null ? o[1].toString() : null);
					p.setDosagem(o[2] != null ? o[2].toString() : null);
					p.setQtdEstoque(o[3] != null ? Integer.parseInt(o[3].toString()) : null);
					p.setDscFabricante(o[4] != null ? o[4].toString() : null);
					p.setVlrProduto(o[5] != null ? Float.parseFloat(o[5].toString()) : null);
					p.setVlrProdutoCusto(o[6] != null ? Float.parseFloat(o[6].toString()) : null);
					p.setCodBarras(o[7] != null ? o[7].toString() : null);
					listaProdutos.add(p); 
				}
			}
		}
		return listaProdutos;
	}

	public void setListaProdutos(List<Produto> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}

	public Produto getProdutoEdicao() {
		if (produtoEdicao == null) {
			produtoEdicao = new Produto();
		}
		return produtoEdicao;
	}

	public void setProdutoEdicao(Produto produtoEdicao) {
		this.produtoEdicao = produtoEdicao;
	}
	
	public void excluir(){
		List<Produto> listaRemocao = new ArrayList<Produto>();
		for(Produto p : listaProdutos){
			if(p.isSelecionado()){
				p.setFlgAtivo('F');
				entityManager.merge(p);
				listaRemocao.add(p);
			}
		}
		entityManager.flush();
		setSelecionadoTodos(false);
		getListaProdutos().removeAll(listaRemocao);
	}
	
	public String salvar(){
		if(empresaSessao == null){
			FacesMessages.instance().add(Severity.ERROR,"Somente empresas podem salvar produtos.");
			return null;
		}
		produtoEdicao.setFlgAtivo('T');
		produtoEdicao.setEmpresa(empresaSessao);
		Produto produtoSalvo = entityManager.merge(produtoEdicao);
		entityManager.flush();
		
		if(!getListaProdutos().contains(produtoSalvo)){
			getListaProdutos().add(produtoSalvo);
		}
		
		produtoEdicao = new Produto();
		FacesMessages.instance().add(Severity.INFO,"Produto salvo com sucesso.");
		return "persisted";
	}
	
	public String voltar(){
		return "voltar";
	}
	
	public String editar(Produto produto){
		produtoEdicao = entityManager.find(Produto.class, produto.getIdProduto());
		return "editar";
	}

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public void selecionaTodos(){
		for(Produto p : listaProdutos){
			if(isSelecionadoTodos()){
				p.setSelecionado(true);
			}else{
				p.setSelecionado(false);
			}
		}
	}
	
}
